package com.ityy.ruiji.controller;

import com.ityy.ruiji.common.R;
import com.ityy.ruiji.entity.Category;
import com.ityy.ruiji.entity.Page;
import com.ityy.ruiji.service.CategoryService;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.InputStream;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/category")
public class CategoryController {

    @Autowired
    CategoryService categoryService;

    @GetMapping("/page")
    public R page(@RequestParam(defaultValue = "1") Integer page ,
                  @RequestParam(defaultValue = "10")Integer pageSize){
        R<Page> result = categoryService.findByPage(page,pageSize);
        return result;
    }

    @PostMapping
    public R save(@RequestBody Category category, HttpSession httpSession){
        Long employee = (Long) httpSession.getAttribute("employee");
        category.setCreateUser(employee);
        category.setUpdateUser(employee);
        R<Category> result=categoryService.save(category);
        return result;
    }

    @DeleteMapping
    public R deleteById(Long id){
       R result= categoryService.deleteById(id);
       return result;
    }

    @PutMapping
    private R updateById(@RequestBody Category category , HttpSession session){
        //1. 获取登陆者的id、补全更人的信息
        Long empId = (Long) session.getAttribute("employee");
        //2. 把数据交给service，得到添加的结果
        category.setUpdateUser(empId);
       R result =  categoryService.updateById(category);
       return result;
    }

    /**
     * 作用： 导出所有的类别信息
     * url:  http://localhost:8080/category/exportExcel
     * 请求方式： get
     * 请求参数： 无
     * 返回值类型 :  无
     *  注意： 如果是做文件下载或者是直接使用response对象输出数据方法的返回值都是void。
     */
    @GetMapping("/exportExcel")
    public void exportExcel(HttpServletResponse response) throws IOException {
        //通知浏览器处理内容的时候要以文件下载形式去处理。通过响应头去设置
        response.setHeader("content-disposition","attachment;filename=category.xlsx");
        //1. 读取模板的输入流
        InputStream inputStream = this.getClass().getResourceAsStream("/excel/cateory.xlsx");
        //2. 通过输入流构建工作簿
        Workbook workbook = new XSSFWorkbook(inputStream);
        //3. 通过工作簿得到工作单
        Sheet sheet = workbook.getSheetAt(0);
        //4. 读取第二行的样式，并且存储到集合中
        List<CellStyle> cellStyleList = new ArrayList<>();
        Row row = sheet.getRow(1);
        for (int i = 1; i <=5 ; i++) {
            Cell cell = row.getCell(i);
            CellStyle cellStyle = cell.getCellStyle(); //获取单元格的样式
            cellStyleList.add(cellStyle);
        }

        //5. 查询所有类别信息
        List<Category> categoryList = categoryService.findAll();
        //6。 遍历所有的类别信息，每一个类别信息就是一行数据，并且设置样式
        for (int i = 0; i < categoryList.size(); i++) {
            //获取出一个类别
            Category category = categoryList.get(i);
            // 每一个类别对应一行，从索引值为1的这一行开始
            row = sheet.createRow(i+1);

            //类别类型
            Cell cell = row.createCell(1);
            //设置单元格内容
            cell.setCellValue(category.getType());
            //设置样式
            cell.setCellStyle(cellStyleList.get(0));

            //类别名称
            cell = row.createCell(2);
            //设置单元格内容
            cell.setCellValue(category.getName());
            //设置样式
            cell.setCellStyle(cellStyleList.get(1));

            //类别排序
            cell = row.createCell(3);
            //设置单元格内容
            cell.setCellValue(category.getSort());
            //设置样式
            cell.setCellStyle(cellStyleList.get(2));

            //创建时间
            cell = row.createCell(4);
            //设置单元格内容
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            cell.setCellValue(dateTimeFormatter.format(category.getCreateTime()));
            //设置样式
            cell.setCellStyle(cellStyleList.get(3));
            //修改时间
            cell = row.createCell(5);
            //设置单元格内容
            cell.setCellValue(dateTimeFormatter.format(category.getUpdateTime()));
            //设置样式
            cell.setCellStyle(cellStyleList.get(4));
        }
        //7  把工作薄写出到浏览器的输出流上。  response.getOutputStream()的输出流就是向浏览器输出数据的输出流
        workbook.write(response.getOutputStream());
    }

    @GetMapping("/list")
    public R list(Integer type){
        R list = categoryService.list(type);
        return list;
    }
}
